/*
 迭代对象中的键值对 => for in 循环 
   问题：
   @1 无法迭代属性名是Symbol类型的属性
   @2 它会迭代所有“可枚举、非Symbol类型”的属性，不管是私有的，还是原型链上公有的
      因为会一层层去查找原型上的属性，看是否可被迭代，所以是所有循环中，性能最差的！！

 可枚举：可以被for/in、Object.keys等方式列举出来的属性，被称之为可枚举的属性
   一般内置属性都是不可枚举的，自己设定的属性一般都是可枚举的
   但是自己可以基于Object.defineProperty修改其枚举性
 */

Object.prototype.cc = 'cc';
let obj = {
    name: 'xxx',
    age: 25,
    0: 100,
    2: 300,
    [Symbol('AA')]: 'AA',
    [Symbol('BB')]: 'BB'
};
let arr = [10, 20, 30, 40, 50, 60];

_.each(arr, (item, index) => {
    console.log(item, index);
    if (index >= 3) return false;
});

_.each(obj, (value, key) => {
    console.log(key, value);
});



//===============
/* 
// 我们期望的迭代方式：只迭代私有、但是可以迭代所有的私有属性「不管啥类型、也不管是否是可枚举的」
// 获取包含相关属性的数组集合
console.log(Object.keys(obj)); //获取 私有的、非Symbol类型的、可枚举的 属性集合
console.log(Object.getOwnPropertyNames(obj)); //获取 私有的、非Symbol类型的 属性集合「忽略是否可枚举，都进行获取的」
console.log(Object.getOwnPropertySymbols(obj)); //获取 私有的、Symbol类型的 属性集合 
*/
/* let keys = Object.getOwnPropertyNames(obj);
if (typeof Symbol !== "undefined") {
    keys = keys.concat(Object.getOwnPropertySymbols(obj));
}
// console.log(keys); //获取所有的私有属性  => 不考虑兼容  Reflect.ownKeys(obj) 获取所有私有属性，等同于上面的操作
keys.forEach(key => {
    console.log(key, obj[key]);
}); */

/* 
for (let key in obj) {
    if (!obj.hasOwnProperty(key)) break; //非要使用这个循环，我们必加的判断
    console.log(key);
} 
*/